package com.hxd.otc.api;

import com.hxd.otc.base.BaseBean;
import com.hxd.otc.module.login.bean.AccountBean;
import com.hxd.otc.module.login.bean.PhoneCodeBean;
import com.hxd.otc.module.my.bean.AppInfoBean;
import com.hxd.otc.module.my.bean.BaseListBean;
import com.hxd.otc.module.my.bean.GoogleCreateBean;
import com.hxd.otc.module.my.bean.ImageCodeBean;
import com.hxd.otc.module.my.bean.MerchantsOrderBean;
import com.hxd.otc.module.my.bean.NoticeBean;
import com.hxd.otc.module.my.bean.RealNameAuthRuleInfoBean;
import com.hxd.otc.module.my.bean.RongCloudTokenBean;
import com.hxd.otc.module.my.bean.RongUserInfoBean;
import com.hxd.otc.module.my.bean.UserStatusBean;
import com.hxd.otc.module.order.bean.FinacialBean;
import com.hxd.otc.module.order.bean.StableCurrencyBean;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.Streaming;
import retrofit2.http.Url;



public interface IUserApi {

    @FormUrlEncoded
    @POST("user/login")
    Observable<BaseBean<AccountBean>> login(@FieldMap Map<String, Object> map);

    @POST("user/logout")
    Observable<BaseBean> logout();

    @POST("user/mobile/resetpwd")
    Observable<BaseBean<String>> forgetPasswordOfPhone(@Query("mobile") String mobile,
                                                       @Query("password") String password,
                                                       @Query("code") String code,
                                                       @Query("countryId") String countryId);

    @GET("otc/appVersion/{type}")
    Observable<BaseBean<AppInfoBean>> getUpdateAppInfo(@Path("type") String type);

    @GET("user/rongCloudToken")
    Observable<BaseBean<RongCloudTokenBean>> getRongCloudToken();

    @GET("user/businessOrderInfo")
    Observable<BaseBean<ArrayList<MerchantsOrderBean>>> businessOrderInfo(@Query("createTime") String createTime,
                                                                          @Query("current") int pageNo,
                                                                          @Query("size") int pageSize);

    @GET("getUserInfoById/{id}")
    Observable<BaseBean<RongUserInfoBean>> getUserInfoById(@Path("id") String id);

    /**
     * 校验手机号是否被绑定过
     */
    @GET("user/findUser")
    Observable<BaseBean<ImageCodeBean>> findUser(@Query("username") String username);

    /**
     * 修改绑定手机号时发送手机验证码
     */
    @POST("user/updateMobileSms")
    Observable<BaseBean<String>> updateMobileSms(@Query("mobile") String mobile, @Query("countryId") String countryId);

    /**
     * 未绑定过手机号的用户，进行绑定手机号时调用发送验证码
     */
    @POST("user/sendMobileSms")
    Observable<BaseBean<String>> sendMobileSms(@Query("mobile") String mobile);

    /**
     * 绑定手机
     */
    @POST("user/mobileBinder")
    Observable<BaseBean<String>> bindPhone(@Query("mobile") String mobile,
                                           @Query("code") String code,
                                           @Query("countryId") String countryId);

    /**
     * 修改绑定手机
     */
    @POST("user/updateUserMobile")
    Observable<BaseBean<String>> updatePhone(@Query("newMobile") String newMobile,
                                             @Query("oldCode") String oldCode,
                                             @Query("newCode") String newCode,
                                             @Query("countryId") String countryId);

    /**
     * 用于修改、验证"验证方式--手机验证"时发送短信验证码
     *
     * @param smsType ex_mobile :发送用于交易时验证的短信验证码;
     *                exchange_pass：用于修改验证方式;
     *                ex_password：交易密码;
     *                bander_google：谷歌认证;
     * @return
     */
    @POST("user/mobile/sendMobileSms")
    Observable<BaseBean<String>> sendExValidTypeMobileSms(@Query("smsType") String smsType);

    /**
     * 用于修改、验证"验证方式--邮箱验证"时发送邮箱验证码
     *
     * @param smsType ex_mail :发送用于交易时验证的短信验证码;
     *                exchange_pass：用于修改验证方式;
     * @return
     */
    @POST("user/mail/sendMail")
    Observable<BaseBean<String>> sendExValidTypeEmail(@Query("smsType") String smsType);


    /**
     * 设置用户的交易密码
     */
    @POST("user/updateExPassword")
    Observable<BaseBean<String>> updateExPassword(@Query("password") String password,
                                                  @Query("code") String code,
                                                  @Query("exPassword") String exPassword);

    /**
     * 初次设置用户的交易验证方式
     *
     * @param exValidType
     * @return
     */
    @POST("user/updateExValidType")
    Observable<BaseBean<ImageCodeBean>> setValidType(@Query("exValidType") String exValidType);

    /**
     * 修改用户的交易验证方式
     *
     * @param exValidType
     * @return
     */
    @POST("user/changeExValidType")
    Observable<BaseBean<ImageCodeBean>> changeExValidType(@Query("exValidType") String exValidType, @Query("code") String code);

    /**
     * 实名验证  国家,证件类型(1-身份证，2-护照),真实姓名，证件号码
     */
    @POST("user/updateUser")
    Observable<BaseBean<String>> realNameVerify(@Query("idCard") String idCard,
                                                @Query("age") String age,
                                                @Query("sex") int sex,
                                                @Query("realName") String realName,
                                                @Query("address") String address,
                                                @Query("countryCode") String countryCode,
                                                @Query("cardUpId") String cardUpId,
                                                @Query("cardDownId") String cardDownId,
                                                @Query("cardFaceId") String cardFaceId);

    /**
     * 实名验证  国家,证件类型(1-身份证，2-护照),真实姓名，证件号码
     */
    @POST("user/updateUserCardOne")
    Observable<BaseBean<String>> realNameVerifyOfV1(@Query("idCard") String idCard,
                                                    @Query("age") String age,
                                                    @Query("sex") int sex,
                                                    @Query("realName") String realName,
                                                    @Query("address") String address,
                                                    @Query("countryCode") String countryCode);

    /**
     * @param cardUpId   身份证正面
     * @param cardDownId 身份证反面
     * @param cardFaceId 手持身份证
     */
    @POST("user/updateUserCardTwo")
    Observable<BaseBean<String>> realNameVerifyOfV2(@Query("cardUpId") String cardUpId,
                                                    @Query("cardDownId") String cardDownId,
                                                    @Query("cardFaceId") String cardFaceId);

    /**
     * 获取实名认证状态
     */
    @GET("user/findCardStatus")
    Observable<BaseBean<UserStatusBean>> findCardStatus();

    /**
     * 获取谷歌code
     */
    @POST("user/createGoogleSecret")
    Observable<BaseBean<GoogleCreateBean>> getGoogleCode();

    /**
     * 绑定谷歌验证码
     *
     * @param code      谷歌验证码
     * @param secret    谷歌密钥
     * @param phoneCode 手机验证码
     */
    @POST("user/googleBinder")
    Observable<BaseBean<String>> bindGoogleCode(@Query("code") String code, @Query("secret") String secret, @Query("smsCode") String phoneCode);

    /**
     * 重置登录密码
     *
     * @param password    新登录密码
     * @param oldPassword 旧登录密码
     */
    @POST("user/updatePassword")
    Observable<BaseBean<String>> updateLoginPassword(@Query("password") String password,
                                                     @Query("oldPassword") String oldPassword);

    /**
     * 验证方式验证码校验接口，校验邮箱验证码、短信验证、谷歌验证码
     *
     * @param code
     * @return
     */
    @POST("user/googleValid")
    Observable<BaseBean<String>> validPayVerCode(@Query("code") String code);

    /**
     * 注册或绑定邮箱时获取邮箱验证码
     *
     * @param mail      邮箱
     * @param type      [binder,register]
     * @param source    [Android]
     * @param scene     [register]
     * @param appKey    阿里appKey
     * @param sessionId 阿里滑块sessionId
     * @return
     */
    @POST("mail/sendCode")
    Observable<BaseBean<ImageCodeBean>> getEmailCode(
            @Query("mail") String mail
            , @Query("type") String type
            , @Query("source") String source
            , @Query("scene") String scene
            , @Query("appKey") String appKey
            , @Query("sessionId") String sessionId);

    /**
     * 绑定邮箱
     */
    @POST("user/binderEmail")
    Observable<BaseBean<String>> bindEmail(@Query("mail") String mail,
                                           @Query("code") String code);


    @GET("otc/notice")
    Observable<BaseBean<BaseListBean<NoticeBean>>> getNoticeList(@Query("current") int currentPage, @Query("size") int showCount, @Query("userId") String userId);

    /**
     * 标记通知已读
     *
     * @param noticeId
     * @return
     */
    @POST("otc/notice/look")
    Observable<BaseBean<String>> lookList(@Query("noticeId") String noticeId, @Query("userId") String userId);


    /**
     * 注册时发送手机验证码
     *
     * @param mobile    手机号
     * @param type      [register(注册),reset（忘记密码）]
     * @param source    [Android ...]
     * @param scene     [register]
     * @param appKey    阿里appKey
     * @param sessionId 阿里滑块sessionId
     */
    @POST("mobile/sendCode")
    Observable<BaseBean<ImageCodeBean>> getPhoneCodeWithVerif(
            @Query("mobile") String mobile
            , @Query("type") String type
            , @Query("source") String source
            , @Query("scene") String scene
            , @Query("appKey") String appKey
            , @Query("sessionId") String sessionId
            , @Query("countryId") String countryId);

    @POST("user/register")
    Observable<BaseBean<String>> register(@Query("registerType") int registerType,
                                          @Query("mail") String mail,
                                          @Query("mobile") String mobile,
                                          @Query("password") String password,
                                          @Query("code") String code,
                                          @Query("inviteCode") String inviteCode,
                                          @Query("countryId") String countryId);

    @POST("user/updateNickName")
    Observable<BaseBean<String>> updateNickName(@Query("nickName") String nickName);

    @GET("user/realNameAuthRuleInfo")
    Observable<BaseBean<ArrayList<RealNameAuthRuleInfoBean>>> getRealNameAuthRuleInfo();

    @GET("otc/endorse/endorse/queryList")
    Observable<BaseBean<StableCurrencyBean>> getStableCurrencyList();

    @GET("otc/endorse/FS/queryList")
    Observable<BaseBean<FinacialBean>> getFinancialList(@Query("size") int pageSize, @Query("current") int currPage);

    //下载大文件时，请加上@Streaming，否则容易出现IO异常
    @Streaming
    @GET
    Observable<ResponseBody> downloadFile(@Url String downloadUrl);

    // 环信注册
    @POST("easemob/register")
    Observable<BaseBean<String>> easemobRegister();

    @GET("otc/noso")
    Observable<BaseBean<Integer>> getNosenseMessageNotice();

    @GET("user/smsCode")
    Observable<BaseBean<List<PhoneCodeBean>>> getPhoneCodeBean();
}
